home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / Python-1.4 / Python1.4_Source / Parser / intrcheck.c < prev    next >
C/C++ Source or Header  |  1996-12-15  |  4KB  |  215 lines

  1. /***********************************************************
  2. Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
  3. The Netherlands.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its
  8. documentation for any purpose and without fee is hereby granted,
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in
  11. supporting documentation, and that the names of Stichting Mathematisch
  12. Centrum or CWI or Corporation for National Research Initiatives or
  13. CNRI not be used in advertising or publicity pertaining to
  14. distribution of the software without specific, written prior
  15. permission.
  16.  
  17. While CWI is the initial source for this software, a modified version
  18. is made available by the Corporation for National Research Initiatives
  19. (CNRI) at the Internet address ftp://ftp.python.org.
  20.  
  21. STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
  22. REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
  23. MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
  24. CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
  25. DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  26. PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  27. TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  28. PERFORMANCE OF THIS SOFTWARE.
  29.  
  30. ******************************************************************/
  31.  
  32. /* Check for interrupts */
  33. #ifdef HAVE_CONFIG_H
  34. #include "config.h"
  35. #endif
  36.  
  37. #ifdef HAVE_UNISTD_H
  38. #include <unistd.h>
  39. #endif
  40.  
  41. #ifdef HAVE_FCNTL_H
  42. #include <fcntl.h>
  43. #endif
  44.  
  45. #include "myproto.h"
  46. #include "intrcheck.h"
  47.  
  48.  
  49. #ifdef QUICKWIN
  50.  
  51. #include <io.h>
  52.  
  53. void
  54. initintr()
  55. {
  56. }
  57.  
  58. int
  59. intrcheck()
  60. {
  61.     _wyield();
  62. }
  63.  
  64. #define OK
  65.  
  66. #endif /* QUICKWIN */
  67.  
  68. #ifdef _M_IX86
  69. #include <io.h>
  70. #endif
  71.  
  72. #if defined(MSDOS) && !defined(QUICKWIN)
  73.  
  74. #ifdef __GNUC__
  75.  
  76. /* This is for DJGPP's GO32 extender.  I don't know how to trap
  77.  * control-C  (There's no API for ctrl-C, and I don't want to mess with
  78.  * the interrupt vectors.)  However, this DOES catch control-break.
  79.  * --Amrit
  80.  */
  81.  
  82. #include <go32.h>
  83.  
  84. void
  85. initintr()
  86. {
  87.     _go32_want_ctrl_break(1 /* TRUE */);
  88. }
  89.  
  90. int
  91. intrcheck()
  92. {
  93.     return _go32_was_ctrl_break_hit();
  94. }
  95.  
  96. #else /* !__GNUC__ */
  97.  
  98. /* This might work for MS-DOS (untested though): */
  99.  
  100. void
  101. initintr()
  102. {
  103. }
  104.  
  105. int
  106. intrcheck()
  107. {
  108.     int interrupted = 0;
  109.     while (kbhit()) {
  110.         if (getch() == '\003')
  111.             interrupted = 1;
  112.     }
  113.     return interrupted;
  114. }
  115.  
  116. #endif /* __GNUC__ */
  117.  
  118. #define OK
  119.  
  120. #endif /* MSDOS && !QUICKWIN */
  121.  
  122.  
  123. #ifdef macintosh
  124.  
  125. /* The Mac interrupt code has moved to macglue.c */
  126. #define OK
  127.  
  128. #endif /* macintosh */
  129.  
  130.  
  131. #ifndef OK
  132.  
  133. /* Default version -- for real operating systems and for Standard C */
  134.  
  135. #include <stdio.h>
  136. #include <string.h>
  137. #include <signal.h>
  138.  
  139. static int interrupted;
  140.  
  141. void
  142. PyErr_SetInterrupt Py_PROTO((void))
  143. {
  144.     interrupted = 1;
  145. }
  146.  
  147. /* ARGSUSED */
  148. static RETSIGTYPE
  149. #if defined(_M_IX86) || defined(__SASC)
  150. intcatcher(int sig)    /* So the C compiler shuts up */
  151. #else /* _M_IX86 */
  152. intcatcher(sig)
  153.     int sig; /* Not used by required by interface */
  154. #endif /* _M_IX86 */
  155. {
  156.     extern void goaway PROTO((int));
  157.     static char message[] =
  158. "python: to interrupt a truly hanging Python program, interrupt once more.\n";
  159.     switch (interrupted++) {
  160.     case 0:
  161.         break;
  162.     case 1:
  163.         write(2, message, strlen(message));
  164.         break;
  165.     case 2:
  166.         interrupted = 0;
  167.         goaway(1);
  168.         break;
  169.     }
  170.     signal(SIGINT, intcatcher);
  171. }
  172.  
  173. void
  174. initintr()
  175. {
  176.     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
  177.         signal(SIGINT, intcatcher);
  178. #ifdef HAVE_SIGINTERRUPT
  179.     /* This is for SunOS and other modern BSD derivatives.
  180.        It means that system calls (like read()) are not restarted
  181.        after an interrupt.  This is necessary so interrupting a
  182.        read() or readline() call works as expected.
  183.        XXX On old BSD (pure 4.2 or older) you may have to do this
  184.        differently! */
  185.     siginterrupt(SIGINT, 1);
  186. #endif /* HAVE_SIGINTERRUPT */
  187. }
  188.  
  189. int
  190. intrcheck()
  191. {
  192.  
  193. #ifdef __SASC
  194.     extern void __regargs __chkabort(void);
  195.     extern void chkabort(void);
  196.  
  197.     chkabort();        /* explicit Amiga SAS/C ^C check */
  198. #endif
  199.  
  200.     if (!interrupted)
  201.         return 0;
  202.     interrupted = 0;
  203.     return 1;
  204. }
  205.  
  206. #ifdef __SASC
  207. /* Amiga SAS/C replacement ^C handler */
  208. void __regargs _CXBRK(void)
  209. {
  210.     interrupted=1;
  211. }
  212. #endif
  213.  
  214. #endif /* !OK */
  215.